/**
 * Created by jiachenpan on 16/11/18.
 */

export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (('' + time).length === 10) time = parseInt(time) * 1000
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

export function formatTime(time, option) {
  time = +time * 1000
  const d = new Date(time)
  const now = Date.now()

  const diff = (now - d) / 1000

  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) { // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
  }
}

export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}

export function cleanArray(actual) {
  const newArray = []
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i])
    }
  }
  return newArray
}

export function param(json) {
  if (!json) return ''
  return cleanArray(Object.keys(json).map(key => {
    if (json[key] === undefined) return ''
    return encodeURIComponent(key) + '=' +
            encodeURIComponent(json[key])
  })).join('&')
}

export function param2Obj(url) {
  let search = url.split('?')[1]
  if (!search) {
    return {}
  }
  search = search.split('&')
  const params = {}
  const _vv = []
  const _v = {}
  search.forEach(function(v) {
    if (v) {
      const param = v.split('=')
      const _key = param[0].split(/[\[|\]]/)
      if (_key.length > 2) {
        if (_key.length === 3) {
          _vv.push(param[1])
          params[_key[0]] = _vv
        } else {
          _v[_key[2]] = param[1]
          params[_key[0]] = _v
        }
      } else {
        params[param[0]] = param[1]
      }
    }
  })
  return params
  // console.log('传递的参数', params)
  // return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
}

// 接口返回数据整理
export function apiData(code, msg, data) {
  const returnData = {}
  returnData.code = code || 200
  returnData.msg = msg || ''
  if (data) {
    returnData.data = data
  }
  return returnData
}

/**
 * 获取随机数
 * @param  {number} min [最小值]
 * @param  {number} max [最大值]
 * return  {number}     [生成的随机数]
 */
export function getRandom(min, max) {
  min = min || 0
  max = max || 10
  return Math.floor(Math.random() * (max - min + 1) + min)
}

/**
 * 去除指定字符串
 * @param  {string} str  要处理的字符串
 * @param  {string} char 要去除的字符
 * @param  {string} type 去除的范围
 * @return {string}      处理好的数据
 */
export function trim(str, char, type) {
  str = str || ''
  char = char || ''
  type = type || ''

  if (char) {
    switch (type.toLowerCase()) {
      case 'left' :
        str = str.replace(new RegExp('^\\' + char + '+', 'g'), '')
        break

      case 'right' :
        str = str.replace(new RegExp('\\' + char + '+$', 'g'), '')
        break

      default :
        str = str.replace(new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'), '')
        break
    }
    return str
  }
  // 处理trim数据
  return str.replace(/^\s+|\s+$/g, '')
}
